package com.changgou.pay.controller;

import com.changgou.pay.config.TokenDecode;
import com.changgou.pay.service.PayService;
import com.github.wxpay.sdk.WXPayUtil;
import org.apache.commons.io.IOUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 支付业务微服务
 */
@RestController
@RequestMapping("/wxpay")
public class PayController {

    @Autowired
    private TokenDecode tokenDecode;

    @Autowired
    private PayService payService;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 预支付接口, 调用这个接口, 这个接口调用微信的统一下单接口
     * 生成支付链接返回
     * @return
     */
    @RequestMapping("/nativePay")
    public Map nativePay() throws Exception {

        //1. 获取当前登录用户的用户名
        Map<String, String> userInfo = tokenDecode.getUserInfo();
        String username = userInfo.get("username");
        //2. 调用service预支付接口
        Map resultMap = payService.nativePay(username);
        //3. 返回
        return resultMap;
    }

    /**
     * 回调接口, 获取微信服务器发过来的支付成功结果
     * @return
     */
    @RequestMapping("/notify")
    public String wxNotify(HttpServletRequest request) throws Exception {
        //1. 将接收到的微信给我们发送到的数据流转成String
        String resultStrXml = IOUtils.toString(request.getInputStream(), "utf-8");

        //2. 将微信返回的xml格式数据转换成Map对象
        Map<String, String> resultMap = WXPayUtil.xmlToMap(resultStrXml);



        /**
         * 3. 将返回的支付成功的订单的订单号, 还有微信生成的支付单号发送给rabbitMq的order_pay队列
         * 进行支付成功业务处理
         */
        //封装参数
        Map<String, String> paramMap = new HashMap<>();
        //获取支付成功的订单号
        paramMap.put("out_trade_no", resultMap.get("out_trade_no"));
        //获取支付成功的交易流水号
        paramMap.put("transaction_id", resultMap.get("transaction_id"));

        //将交易成功的订单号和交易流水号发送到rabbitMq的队列中
        rabbitTemplate.convertAndSend("", "order_pay", paramMap);


        /**
         * 4. 将支付成功的订单号, 发送到rabbitMq的paynotify交换器中
         * paynotify交换器使用websocket技术和页面相连, 主动推送成功数据到页面, 页面跳转到支付成功页面
         */
        rabbitTemplate.convertAndSend("paynotify", "", resultMap.get("out_trade_no"));

        /**
         * 5. 给微信回调服务器, 返回我们的接收状态,
         * 告诉微信服务器, 我们接收到回调了, 不要再骚扰我了
         */
        Map<String, String> wxResultMap = new HashMap<>();
        wxResultMap.put("return_code", "SUCCESS");
        wxResultMap.put("return_msg", "OK");

        //利用微信的工具类, 将给微信返回的map格式数据, 转换成xml格式字符串返回
        String wxResultXml = WXPayUtil.mapToXml(wxResultMap);
        return wxResultXml;
    }

    /**
     * 调用微信查询接口, 查询支付状态
     * @param orderId 订单id
     * @return
     */
    @GetMapping("/query/{orderId}")
    public Map queryPay(@PathVariable(value = "orderId") String orderId) {
        Map resultMap = payService.queryPay(orderId);
        return resultMap;
    }

    /**
     * 根据订单id, 关闭微信支付通道
     * @param orderId
     * @return
     */
    @GetMapping("/close/{orderId}")
    public Map closePay(@PathVariable(value = "orderId") String orderId) {
        Map resultMap = payService.closePay(orderId);
        return resultMap;
    }
}
